package com.square.service.redis.consumer.feign;

import com.baomidou.mybatisplus.extension.api.R;
import com.square.service.redis.consumer.fallback.RedisFeignFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

/**
 * redis消费Feign
 *
 * @author : 王苏
 * @since : 2021/4/17 9:26
 */
@Component
@FeignClient(name = "redis", fallback = RedisFeignFallback.class)
public interface RedisFeign {
    /**
     * 指定缓存失效时间
     */
    @PostMapping("/rpc/setExpire")
    R<?> setExpire(@RequestParam("key") String key, @RequestParam("time") long time);

    /**
     * 根据key 获取过期时间
     */
    @PostMapping("/rpc/getExpire")
    R<?> getExpire(@RequestParam("key") String key);

    /**
     * 判断key是否存在
     */
    @PostMapping("/rpc/hasKey")
    R<?> hasKey(@RequestParam("key") String key);

    /**
     * 删除缓存
     */
    @PostMapping("/rpc/delete")
    R<?> delete(@RequestParam("key") String key);

    /**
     * 普通缓存获取
     */
    @PostMapping("/rpc/get")
    R<?> get(@RequestParam("key") String key);

    /**
     * 普通缓存放入
     */
    @PostMapping("/rpc/set")
    R<?> set(@RequestParam("key") String key, @RequestParam("value") Object value);

    /**
     * 普通缓存放入并设置时间
     */
    @PostMapping("/rpc/setWithTime")
    R<?> set(@RequestParam("key") String key, @RequestParam("value") Object value, @RequestParam("time") long time);

    /**
     * 递增
     */
    @PostMapping("/rpc/increment")
    R<?> increment(@RequestParam("key") String key, @RequestParam("delta") long delta);

    /**
     * 递减
     */
    @PostMapping("/rpc/decreasing")
    R<?> decreasing(@RequestParam("key") String key, @RequestParam("delta") long delta);

    /**
     * HashGet
     */
    @PostMapping("/rpc/getHashMap")
    R<?> getHashMap(@RequestParam("key") String key, @RequestParam("item") String item);

    /**
     * 获取hashKey对应的所有键值
     */
    @PostMapping("/rpc/getHashMapAllKey")
    R<?> getHashMap(@RequestParam("key") String key);

    /**
     * HashSet
     */
    @PostMapping("/rpc/setHashMap")
    R<?> setHashMap(@RequestParam("key") String key, @RequestParam("map") Map<String, Object> map);

    /**
     * HashSet 并设置时间
     */
    @PostMapping("/rpc/setHashMapWithTime")
    R<?> setHashMap(@RequestParam("key") String key, @RequestParam("map") Map<String, Object> map, @RequestParam("time") long time);

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     */
    @PostMapping("/rpc/setHashMapSingle")
    R<?> setHashMap(@RequestParam("key") String key, @RequestParam("item") String item, @RequestParam("value") Object value);

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     */
    @PostMapping("/rpc/setHashMapSingleWithTime")
    R<?> setHashMap(@RequestParam("key") String key, @RequestParam("item") String item, @RequestParam("value") Object value, @RequestParam("time") long time);

    /**
     * 删除hash表中的值
     */
    @PostMapping("/rpc/deleteHashMap")
    R<?> deleteHashMap(@RequestParam("key") String key, @RequestParam("item") Object... item);

    /**
     * 判断hash表中是否有该项的值
     */
    @PostMapping("/rpc/hasKeyForHashMap")
    R<?> hasKeyForHashMap(@RequestParam("key") String key, @RequestParam("item") String item);

    /**
     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
     */
    @PostMapping("/rpc/incrementForHashMap")
    R<?> incrementForHashMap(@RequestParam("key") String key, @RequestParam("item") String item, @RequestParam("by") double by);

    /**
     * hash递减
     */
    @PostMapping("/rpc/decreasingForHashMap")
    R<?> decreasingForHashMap(@RequestParam("key") String key, @RequestParam("item") String item, @RequestParam("by") double by);

    /**
     * 根据key获取Set中的所有值
     */
    @PostMapping("/rpc/getSet")
    R<?> getSet(@RequestParam("key") String key);

    /**
     * 根据value从一个set中查询,是否存在
     */
    @PostMapping("/rpc/hasKeyForSet")
    R<?> hasKeyForSet(@RequestParam("key") String key, @RequestParam("value") Object value);

    /**
     * 将数据放入set缓存
     */
    @PostMapping("/rpc/setSet")
    R<?> setSet(@RequestParam("key") String key, @RequestParam("values") Object... values);

    /**
     * 将set数据放入缓存
     */
    @PostMapping("/rpc/setSetWithTime")
    R<?> setSet(@RequestParam("key") String key, @RequestParam("time") long time, @RequestParam("values") Object... values);

    /**
     * 获取set缓存的长度
     */
    @PostMapping("/rpc/getSetSize")
    R<?> getSetSize(@RequestParam("key") String key);

    /**
     * 移除值为value的
     */
    @PostMapping("/rpc/removeSet")
    R<?> removeSet(@RequestParam("key") String key, @RequestParam("values") Object... values);

    /**
     * 获取list缓存的内容
     */
    @PostMapping("/rpc/getList")
    R<?> getList(@RequestParam("key") String key, @RequestParam("start") long start, @RequestParam("end") long end);

    /**
     * 获取list缓存的长度
     */
    @PostMapping("/rpc/getListSize")
    R<?> getListSize(@RequestParam("key") String key);

    /**
     * 通过索引 获取list中的值
     */
    @PostMapping("/rpc/getListObjByIndex")
    R<?> getListObjByIndex(@RequestParam("key") String key, @RequestParam("index") long index);

    /**
     * 将list放入缓存
     */
    @PostMapping("/rpc/setList")
    R<?> setList(@RequestParam("key") String key, @RequestParam("value") Object value);

    /**
     * 将list放入缓存
     */
    @PostMapping("/rpc/setListWithTime")
    R<?> setList(@RequestParam("key") String key, @RequestParam("value") Object value, @RequestParam("time") long time);

    /**
     * 将list放入缓存
     */
    @PostMapping("/rpc/setListGeneric")
    R<?> setList(@RequestParam("key") String key, @RequestParam("value") List<Object> value);

    /**
     * 将list放入缓存
     */
    @PostMapping("/rpc/setListGenericWithTime")
    R<?> setList(@RequestParam("key") String key, @RequestParam("value") List<Object> value, @RequestParam("time") long time);

    /**
     * 根据索引修改list中的某条数据
     */
    @PostMapping("/rpc/updateListObjByIndex")
    R<?> updateListObjByIndex(@RequestParam("key") String key, @RequestParam("index") long index, @RequestParam("value") Object value);

    /**
     * 移除N个值为value
     */
    @PostMapping("/rpc/removeList")
    R<?> removeList(@RequestParam("key") String key, @RequestParam("count") long count, @RequestParam("value") Object value);

    /**
     * 添加一个元素, zset与set最大的区别就是每个元素都有一个score，因此有个排序的辅助功能;  zadd
     */
    @PostMapping("/rpc/setZSet")
    R<?> setZSet(@RequestParam("key") String key, @RequestParam("value") Object value, @RequestParam("score") Double score);

    /**
     * 删除元素 zrem
     */
    @PostMapping("/rpc/removeZSet")
    R<?> removeZSet(@RequestParam("key") String key, @RequestParam("value") String value);

    /**
     * 递增
     */
    @PostMapping("/rpc/incrementForZSet")
    R<?> incrementForZSet(@RequestParam("key") String key, @RequestParam("value") String value, @RequestParam("score") double score);

    /**
     * 查询value对应的score   zscore
     */
    @PostMapping("/rpc/getZSetScore")
    R<?> getZSetScore(@RequestParam("key") String key, @RequestParam("value") String value);

    /**
     * 判断value在zset中的排名  zrank
     */
    @PostMapping("/rpc/getZSetRank")
    R<?> getZSetRank(@RequestParam("key") String key, @RequestParam("value") String value);

    /**
     * 返回集合的长度
     */
    @PostMapping("/rpc/getZSetSize")
    R<?> getZSetSize(@RequestParam("key") String key);


    /**
     * 查询集合中指定顺序的值， 0 -1 表示获取全部的集合内容  zrange
     */
    @PostMapping("/rpc/getZSetRange")
    R<?> getZSetRange(@RequestParam("key") String key, @RequestParam("start") int start, @RequestParam("end") int end);
}
